//package titt.util.event;
//
//import java.util.ArrayList;
//
//public class TITTEventQueue {
//
//	private ArrayList<EventAction> eventList = new ArrayList<EventAction>();
//	private Thread t;
//	private Object notifyObject;
//
//	public TITTEventQueue() {
//		this(new Object());
//	}
//
//	public TITTEventQueue(Object notifyObject) {
//		this.notifyObject = notifyObject;
//		startEventLoop();
//	}
//
//	public void add(EventAction e) {
//		synchronized (eventList) {
//			eventList.add(e);
//			eventList.notifyAll();
//		}
//	}
//
//	public int getQueueSize() {
//		return eventList.size();
//	}
//
//	public void emptyQueue() {
//		try {
//			synchronized (notifyObject) {			
//				while(getQueueSize() > 0)
//					notifyObject.wait();
//			}
//		}
//		catch(Exception e) {}
//	}
//
//	private void startEventLoop() {
//		t = new Thread(new Runnable() {
//			public void run() {
//				try {
//					while(true) {
//						while(eventList.size() == 0) {
//							synchronized (eventList) {
//								eventList.wait();
//							}
//						}
//						try {
//							synchronized (eventList) {
//								try {
//									eventList.get(0).eventPerformed();
//								}
//								catch(Exception e) {
//								}
//								eventList.remove(0);
//							}
//						}
//						catch(Exception e) {
//						}
//
//						if(notifyObject != null)
//							synchronized (notifyObject) {
//								notifyObject.notifyAll();
//							}
//					}
//				}
//				catch(Exception e) {}
//			}
//		});
//		t.start();
//	}
//
//	public void stop() {
//		t.interrupt();
//	}
//}

package titt.util.event;

import java.util.ArrayList;
import java.util.List;

import titt.service.threading.SingleTITTThreader;
import titt.service.threading.TITTThreader;

public class TITTEventQueue {

	private final TITTThreader threader = new SingleTITTThreader();
	private final List<EventAction> queue = new ArrayList<EventAction>();
	
	public synchronized void add(EventAction e) {
		queue.add(e);
		threader.execute(new Adaptor(e));
	}
	
	private synchronized void remove(EventAction e) {
		queue.remove(e);
		notifyAll();
	}

	public synchronized int getQueueSize() {
		return queue.size();
	}

	public synchronized void clearQueue() {
		threader.clear();
	}
	
	public synchronized void emptyQueue() {
		try {
			while(queue.size() > 0)
				wait();
			}
		catch(Exception e) {}
	}

	public void stop() {
		threader.clear();
	}
	
	private class Adaptor implements Runnable {
		private EventAction a;
		public Adaptor(EventAction a) {
			this.a = a;
		}
		@Override
		public void run() {
			try {
				a.eventPerformed();
				remove(a);
			}
			catch(Exception e) {}
		}
	}
}
